﻿using System;
using System.Text;
using System.IO;
using System.Collections.Specialized;

namespace NeroConnect.Network
{
    class HttpListenerResponse : IListenerResponse
    {
        private HttpListenerContext _context;
		private MiniHttpServer.IHttpResponse _listenerResponse;
		//private bool _disposed = false;

        public HttpListenerResponse(HttpListenerContext context, MiniHttpServer.IHttpResponse httpListenerResponse)
		{
			if (httpListenerResponse == null)
				throw new ArgumentNullException("httpListenerResponse");

            _context = context;
			_listenerResponse = httpListenerResponse;
		}

        public void Dispose()
        {

        }

        public Encoding ContentEncoding
        {
            get
            {
                return System.Text.Encoding.UTF8;// _listenerResponse.Encoding;
            }
            set
            {
                //_listenerResponse.Encoding = value;
            }
		}

		public long ContentLength64
		{
			get
			{
				return _listenerResponse.ContentLength;
			}
			set
			{
                _listenerResponse.ContentLength = value;
			}
		}

		public string ContentType
		{
			get
			{
				return _listenerResponse.ContentType;
			}
			set
			{
				_listenerResponse.ContentType = value;
			}
		}

		public System.Net.CookieCollection Cookies
		{
			get
			{
                return null;
                //return _listenerResponse.Cookies;
			}
			set
			{
			}
		}

		public System.Net.WebHeaderCollection Headers
		{
			get
			{
                System.Net.WebHeaderCollection result = new System.Net.WebHeaderCollection();
                result.Add(_listenerResponse.Headers);
                return result;
			}
		}

		public bool KeepAlive
		{
			get
			{
                return _listenerResponse.KeepAlive;
			}
            set
            {
                _listenerResponse.KeepAlive = value;
            }
		}

		public Stream OutputStream
		{
			get { 
                return _listenerResponse.GetBody(); 
            }
		}

		public bool SendChunked
		{
			get
			{
				return true;
			}
            set
            {
                _listenerResponse.Chunked = true;
            }
		}

		public System.Net.HttpStatusCode StatusCode
		{
			get
			{
                return _listenerResponse.Status;
 			}
			set
			{
                _listenerResponse.Status = value;
			}
		}

		public string StatusDescription
		{
			get
			{
                return _listenerResponse.Status.ToString();
			}
		}

		public void Abort()
		{
		}

		public void AddHeader(string name, string value)
		{
            _listenerResponse.AddHeaderValue(name, value);
		}

		public void AppendCookie(System.Net.Cookie cookie)
		{
            // _listenerResponse.Cookies.Add(new HttpServer.Messages.ResponseCookie(cookie.Name, cookie.Value, cookie.Expires, cookie.Path, cookie.Domain));
		}

		public void AppendHeader(string name, string value)
		{
            _listenerResponse.AddHeaderValue(name, value);
		}

		public void Close()
		{
            // sending nothing basically
            _context.Close();
 		}

		public void Redirect(string url)
		{
			//_listenerResponse.Redirect(url);
		}

		public void SetCookie(System.Net.Cookie cookie)
		{
            //_listenerResponse.Cookies.Add(new HttpServer.Messages.ResponseCookie(cookie.Name, cookie.Value, cookie.Expires, cookie.Path, cookie.Domain));
		}
    }
    //class HttpListenerResponse : IListenerResponse
    //{
    //    private System.Net.HttpListenerResponse _listenerResponse;
    //    private bool _disposed = false;

    //    public HttpListenerResponse(System.Net.HttpListenerResponse httpListenerResponse)
    //    {
    //        if (httpListenerResponse == null)
    //            throw new ArgumentNullException("httpListenerResponse");

    //        _listenerResponse = httpListenerResponse;
    //    }

    //    ~HttpListenerResponse()
    //    {
    //        Dispose(false);
    //    }

    //    public Encoding ContentEncoding
    //    {
    //        get
    //        {
    //            return _listenerResponse.ContentEncoding;
    //        }
    //        set
    //        {
    //            _listenerResponse.ContentEncoding = value;
    //        }
    //    }

    //    public long ContentLength64
    //    {
    //        get
    //        {
    //            return _listenerResponse.ContentLength64;
    //        }
    //        set
    //        {
    //            _listenerResponse.ContentLength64 = value;
    //        }
    //    }

    //    public string ContentType
    //    {
    //        get
    //        {
    //            return _listenerResponse.ContentType;
    //        }
    //        set
    //        {
    //            _listenerResponse.ContentType = value;
    //        }
    //    }

    //    public System.Net.CookieCollection Cookies
    //    {
    //        get
    //        {
    //            return _listenerResponse.Cookies;
    //        }
    //        set
    //        {
    //            _listenerResponse.Cookies = value;
    //        }
    //    }

    //    public System.Net.WebHeaderCollection Headers
    //    {
    //        get
    //        {
    //            return _listenerResponse.Headers;
    //        }
    //        set
    //        {
    //            _listenerResponse.Headers = value;
    //        }
    //    }

    //    public bool KeepAlive
    //    {
    //        get
    //        {
    //            return _listenerResponse.KeepAlive;
    //        }
    //        set
    //        {
    //            _listenerResponse.KeepAlive = value;
    //        }
    //    }

    //    public Stream OutputStream
    //    {
    //        get { return _listenerResponse.OutputStream; }
    //    }

    //    public bool SendChunked
    //    {
    //        get
    //        {
    //            return _listenerResponse.SendChunked;
    //        }
    //        set
    //        {
    //            _listenerResponse.SendChunked = value;
    //        }
    //    }

    //    public System.Net.HttpStatusCode StatusCode
    //    {
    //        get
    //        {
    //            return (System.Net.HttpStatusCode)_listenerResponse.StatusCode;
    //        }
    //        set
    //        {
    //            _listenerResponse.StatusCode = (int)value;
    //        }
    //    }

    //    public string StatusDescription
    //    {
    //        get
    //        {
    //            return _listenerResponse.StatusDescription;
    //        }
    //    }

    //    public void Abort()
    //    {
    //        _listenerResponse.Abort();
    //        _disposed = true;
    //    }

    //    public void AddHeader(string name, string value)
    //    {
    //        _listenerResponse.AddHeader(name, value);
    //    }

    //    public void AppendCookie(System.Net.Cookie cookie)
    //    {
    //        _listenerResponse.AppendCookie(cookie);
    //    }

    //    public void AppendHeader(string name, string value)
    //    {
    //        _listenerResponse.AppendHeader(name, value);
    //    }

    //    public void Close()
    //    {
    //        _listenerResponse.Close();
    //        _disposed = true;
    //    }

    //    public void Redirect(string url)
    //    {
    //        _listenerResponse.Redirect(url);
    //    }

    //    public void SetCookie(System.Net.Cookie cookie)
    //    {
    //        _listenerResponse.SetCookie(cookie);
    //    }

    //    public void Dispose()
    //    {
    //        Dispose(true);
    //        GC.SuppressFinalize(this);
    //    }

    //    private void Dispose(bool disposing)
    //    {
    //        if (_disposed)
    //            return;
    //        if (disposing)
    //            _listenerResponse.Close();
    //        _disposed = true;
    //    }
    //}
}
